
package com.controladores.controlvehicular.controlador;



import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;


import com.controladores.controlvehicular.InicioSesion;
import com.controladores.controlvehicular.Localizacion;
import com.controladores.controlvehicular.ZonaTrabajo1;
import com.controladores.controlvehicular.ZonasControl;
import com.controladores.controlvehicular.comunicacion.ComunicacionTCP;
import com.controladores.controlvehicular.basededatos.GestorBaseDatos;

import android.R;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.AsyncTask;
import android.support.v4.app.NotificationCompat;
import android.widget.Toast;

/**
 * Clase que obtiene y envía al servidor la ubicación del usuario cada periodo de tiempo
 * @author Luis Soto <lsantoniosoto@gmail.com>
 * @author Mariuxi Salinas <mariuxidelcisne@gmail.com>
 * @version 1.0, 11/04/2014
 */
public class Posicion extends AsyncTask<Void, String, Void> {        
        private String nombreUsuario;
        private double latitud;
        private double longitud;
        private double [] latitudes;
        private double [] longitudes;
        private Localizacion loc;
        ComunicacionTCP comunicacion;
        private String alarma;
        private String mensaje;
        //private int id=0;
        //private static final int HELLO_ID = 1;
        private static final int ALERTA_ID = 1;
        static NotificationManager notificador;
        
        /**
         * Proceso en segundo plano que obtiene posicion cada perido de tiempo
         */
        @Override
        protected Void doInBackground(Void... params) {
                
        
                // TODO Auto-generated method stub
                try {
                        while(true){
                                String ubicacion =loc.obtenerPosicion();
                                String [] latiLongi = descomposeT(ubicacion, ",");
                                latitud=Double.parseDouble(latiLongi[0]);
                                longitud=Double.parseDouble(latiLongi[1]);
                                boolean aviso=Geocerca.puntoEnElPoligono(latitudes.length, latitudes, longitudes, latitud, longitud);
                                if(aviso==false){
                                        mensaje="Usted ha abandonado su zona de trabajo";
                                        publishProgress(mensaje);
                                        //System.out.println(mensaje);                                  
                                        alarma="1";             
                                        //notificacion();
                                }else{
                                        alarma="0";
                                }
                                try {
                                        Calendar c= Calendar.getInstance();
                                        String horaPosicion=c.get(Calendar.HOUR_OF_DAY)+":"+c.get(Calendar.MINUTE);
                                        Date fecha = new Date();
                                        DateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
                                        comunicacion=new ComunicacionTCP();
                                        String respuestaComunicaion=comunicacion.gestionarConexionEnvioPosicion(nombreUsuario,dateFormat.format(fecha),horaPosicion, String.valueOf(latitud),String.valueOf(longitud),alarma);
                                        
                                        if(respuestaComunicaion.compareTo("1")==0){
                                                System.out.println("se envio posicion");
                                        }else{
                                                if(respuestaComunicaion.compareTo("e")==0){
                                                        System.out.println("No existe comunicacion con el servidor para enviar posicion");
                                                }
                                        }
                                } catch (Exception e) {
                                        // TODO: handle exception                                       
                                }

                                Thread.sleep(60000);
                        }
                        
                        
                } catch (Exception e) {
                        // TODO: handle exception
                }
                
                
                
                return null;
        }
        
        /**
         * Compara alerta
         */
        @Override
        protected void onProgressUpdate(String... values) {
                if(mensaje.compareTo("Usted ha abandonado su zona de trabajo")==0){
                        System.out.println("U a s zona trabajo");
                        notificacion();
                }else{
                        System.out.println("U esta en s zona trabajo");
                }
                
                
        }
        
        /**
         * Obtiene datos desde la clase que representa el mapa
         * @param localizacion objeto de tipo Localizacion
         * @param latitud latitud de la ubicación
         * @param longitud longitud de la ubicación
         * @param nombreControlador nombre de usuario
         */
        public void recibirDatos(Localizacion localizacion, double [] latitud, double [] longitud,String nombreControlador){   
                this.loc=localizacion;
                this.latitudes=latitud;
                this.longitudes=longitud;
                this.nombreUsuario=nombreControlador;
                
        }
        
        public String[] descomposeT(String trama, String separador) {
                String[] elementos = trama.split(separador);
                return elementos;
        }
        
        
        /**
         * Lanza una notificación cuando el usurio está fuera de su zona de trabajo
         */
        public void notificacion(){             
                /*NotificationManager*/ notificador = (NotificationManager)loc.getApplicationContext().getSystemService(loc.getApplicationContext().NOTIFICATION_SERVICE);
                //Uri defaultSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
                @SuppressWarnings("deprecation")
				Notification notificacion = new Notification(android.R.drawable.stat_sys_warning, "Mensaje de alerta", System.currentTimeMillis());
                //notificacion.sound = defaultSound;
                notificacion.defaults |= Notification.DEFAULT_SOUND;
                GestorBaseDatos sesion = new GestorBaseDatos(
                                loc.getApplicationContext());
                sesion.abrirBaseDatos();
                String estado = sesion.consultarEstadoSesion();
                sesion.close();
                Intent notificacionIntent;
                if (estado.compareTo("1") == 0) {
                        notificacionIntent = new Intent(loc.getApplicationContext(),ZonasControl.class);
                }else {
                        notificacionIntent = new Intent(loc.getApplicationContext(),InicioSesion.class);
                } 
                //Intent notificacionIntent = new Intent(loc.getApplicationContext(),ZonasControl.class);
                PendingIntent contentIntent = PendingIntent.getActivity(loc.getApplicationContext(), 0, notificacionIntent, 0);
                notificacion.setLatestEventInfo(loc.getApplicationContext(),"Alerta", mensaje, contentIntent );
                notificacion.flags |= Notification.FLAG_AUTO_CANCEL;
                notificador.notify(ALERTA_ID, notificacion);
                //notificador.cancelAll();
        }
        
        /**
         * Obtiene la notificación que ha sido lanzada
         * @return NotificationManager notificación
         */
        public static NotificationManager obtenerNotificacion(){
                return notificador;
        }
}
